/*
 * Copyright 2013 the original author or authors.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.schildbach.wallet.ui;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;

import com.google.bitcoin.core.Transaction;
import com.google.bitcoin.core.VerificationException;
import com.google.bitcoin.core.Wallet;

import de.schildbach.wallet.WalletApplication;
import de.schildbach.wallet.service.BlockchainService;
import de.schildbach.wallet.service.BlockchainServiceImpl;

/**
 * @author Andreas Schildbach
 */
public abstract class AbstractOnDemandServiceActivity extends AbstractWalletActivity
{
	
	@CheckForNull
	private BlockchainService blockchainService;

	private final ServiceConnection serviceConnection = new ServiceConnection()
	{
		@Override
		public void onServiceConnected(final ComponentName name, final IBinder binder)
		{
			blockchainService = ((BlockchainServiceImpl.LocalBinder) binder).getService();
		}

		@Override
		public void onServiceDisconnected(final ComponentName name)
		{
			blockchainService = null;
		}
	};
	
	
	@Override
	protected void onCreate(final Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);

		bindService(new Intent(this, BlockchainServiceImpl.class), serviceConnection, Context.BIND_AUTO_CREATE);
	}

	@Override
	protected void onDestroy()
	{
		unbindService(serviceConnection);

		super.onDestroy();
	}

	protected BlockchainService getBlockchainService()
	{
		return blockchainService;
	}
	
	protected void processDirectTransaction(@Nonnull final Transaction tx)
	{
		final Wallet wallet = getWalletApplication().getWallet();

		try
		{
			if (wallet.isTransactionRelevant(tx))
			{
				wallet.receivePending(tx, null);

				final WalletApplication application = (WalletApplication) getApplication();
				application.broadcastTransaction(tx);
			}
			else
			{
				longToast("Direct transaction is not relevant for you.");
			}
		}
		catch (final VerificationException x)
		{
			longToast("Direct transaction is not valid.");
		}
	}
}
